import http from 'wechat-http'

// 配置基地址
http.baseURL = 'https://live-api.itheima.net'

// 请求拦截器
http.intercept.request = (config) => {
  // 设置默认请求头
  const defaultHeader = {}
  // 如果有token, 默认请求头上应该带 token
  const token = wx.getStorageSync('token')
  if (token) defaultHeader.Authorization = 'Bearer ' + token

  config.header = {
    // 注意合并顺序
    // 先放入默认请求头,  带有默认 token
    ...defaultHeader,
    // 放入真正拦截到的请求, 如果拦截到的是普通请求, 一切正常
    // 但是如果拦截到的是更新token的请求, 由于 config.header 比较靠后
    // 他的 Authorization 会覆盖之前的token, 保证请求成功
    ...config.header,
  }

  return config
}

// 响应拦截器
// http.intercept.response = (res) => {
//   return res.data
// }
http.intercept.response = async ({ statusCode, data, config }) => {
  // token 失效
  if (statusCode === 401) {
    // 有一种特殊请求, 是本来已经在发更新请求,
    // 还是报错, 就直接调回登录页
    // config 是调用接口的参数
    // refreshToken 过期的情形
    if (config.url.includes('/refreshToken')) {
      // 读取当前历史栈
      const pageStack = getCurrentPages()
      // 取出当前页面路径，登录成功能跳转到该页面
      const lastPage = pageStack[pageStack.length - 1]
      // 取出当前页面路径，登录成功能跳转到该页面
      const redirectURL = lastPage.route

      // 引导用户到登录页面
      return wx.redirectTo({
        url: `/pages/login/index?redirectURL=/${redirectURL}`,
      })
    }

    const refreshToken = wx.getStorageSync('refreshToken')
    const res = await http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: 'Bearer ' + refreshToken
      }
    })

    // 储存新的 token 和 refreshToken
    wx.setStorageSync('token', res.data.token)
    wx.setStorageSync('refreshToken', res.data.refreshToken)

    // 返回原来用户想要发的请求, 但是注意要调整 config.header.Authorization 
    // 变为新的 token 才行
    return http({
      ...config,
      header: {
        ...config.header,
        Authorization: 'Bearer ' + res.data.token
      }
    })
  }
  // 成功
  return data
}
// http.intercept.response = (res) => {
//   return res.data
// }

// 对应全局引入的用法
wx.http = http
// 对应局部引入的用法
export default http